/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package vista;

import dao.DAOCliente;
import dao.DAOInmueble;
import dao.DAOProvincia;
import dao.DAOReservaInmueble;
import dao.DAOVentaInmueble;
import dto.DTOInmueble;
import entidades.Cliente;
import entidades.Inmueble;
import entidades.Localidad;
import entidades.ReservaInmueble;
import inmobiliariafrsf.GenerarCatalogo;
import java.awt.Color;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
import java.util.Vector;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import static vista.VPrincipal.codigos;

/**
 * Este panel contiene los componentes y las funcionalidades principales para la
 * realización de las operaciones relacionadas con Inmuebles.
 * Se generara una instancia nueva al seleccionar el botón Inmuebles dentro de 
 * la ventana principal.
 * Las funcionalidades permitidas son:
 * - Agregar
 * - Modificar
 * - Eliminar
 * - Reservar
 * - Vender
 * - Generar Catálogo
 */
public class PListadoInmuebles extends javax.swing.JPanel {

    /**
     * Se almacenan los inmuebles encontrados en la última búsqueda
     */
    private Vector<Inmueble> inmueblesBusqueda;
    
    /**
     * Creates new form PListadoInmueble
     */
    public PListadoInmuebles() {
        initComponents();
    }

    /**
     * Id que recibo de la búsqueda de cliente para crear catálogo
     */
    private String numDoc_cliente;

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        pFiltros = new javax.swing.JPanel();
        tfBarrio = new javax.swing.JTextField();
        cbLocalidad = new javax.swing.JComboBox();
        bFiltrar = new javax.swing.JButton();
        cbProvincia = new javax.swing.JComboBox(DAOProvincia.getAllNombres());
        lBarrio = new javax.swing.JLabel();
        cbTipoInmueble = new javax.swing.JComboBox();
        lPrecio = new javax.swing.JLabel();
        lDormitorios = new javax.swing.JLabel();
        tfDormitorios = new javax.swing.JTextField();
        tfPrecioDesde = new javax.swing.JTextField();
        lPrecio2 = new javax.swing.JLabel();
        tfPrecioHasta = new javax.swing.JTextField();
        spScroll = new javax.swing.JScrollPane();
        tResultados = new javax.swing.JTable();
        bAgregar = new javax.swing.JButton();
        bModificar = new javax.swing.JButton();
        bEliminar = new javax.swing.JButton();
        bReservar = new javax.swing.JButton();
        bVender = new javax.swing.JButton();
        bCatalogo = new javax.swing.JButton();

        setMinimumSize(new java.awt.Dimension(556, 340));
        setName("pListadoInmuebles"); // NOI18N
        setPreferredSize(new java.awt.Dimension(556, 340));

        pFiltros.setBorder(javax.swing.BorderFactory.createTitledBorder("Filtros"));
        pFiltros.setName("pListadoInmuebles"); // NOI18N

        cbLocalidad.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Localidad" }));

        bFiltrar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/search_button_green_16.png"))); // NOI18N
        bFiltrar.setText("Filtrar");
        bFiltrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bFiltrarActionPerformed(evt);
            }
        });

        cbProvincia.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cbProvinciafiltrarLocalidades(evt);
            }
        });

        lBarrio.setText("Barrio:");

        cbTipoInmueble.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Tipo de Inmueble", "Local", "Casa", "Departamento", "Terreno", "Quinta", "Garage" }));
        cbTipoInmueble.setInheritsPopupMenu(true);

        lPrecio.setText("Precio Desde: $");

        lDormitorios.setText("Cant. Dormitorios:");

        lPrecio2.setText("Hasta: $");

        javax.swing.GroupLayout pFiltrosLayout = new javax.swing.GroupLayout(pFiltros);
        pFiltros.setLayout(pFiltrosLayout);
        pFiltrosLayout.setHorizontalGroup(
            pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pFiltrosLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pFiltrosLayout.createSequentialGroup()
                        .addComponent(lPrecio)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tfPrecioDesde))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pFiltrosLayout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, pFiltrosLayout.createSequentialGroup()
                                .addComponent(lBarrio)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(tfBarrio))
                            .addComponent(cbProvincia, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(cbLocalidad, javax.swing.GroupLayout.PREFERRED_SIZE, 316, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGroup(pFiltrosLayout.createSequentialGroup()
                            .addComponent(cbTipoInmueble, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGap(18, 18, 18)
                            .addComponent(lDormitorios)
                            .addGap(6, 6, 6)
                            .addComponent(tfDormitorios)))
                    .addGroup(pFiltrosLayout.createSequentialGroup()
                        .addComponent(lPrecio2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tfPrecioHasta, javax.swing.GroupLayout.PREFERRED_SIZE, 185, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(bFiltrar, javax.swing.GroupLayout.PREFERRED_SIZE, 85, javax.swing.GroupLayout.PREFERRED_SIZE))))
        );
        pFiltrosLayout.setVerticalGroup(
            pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pFiltrosLayout.createSequentialGroup()
                .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cbProvincia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cbLocalidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(lDormitorios)
                        .addComponent(tfDormitorios, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(tfBarrio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lBarrio)
                        .addComponent(cbTipoInmueble, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(0, 11, Short.MAX_VALUE)
                .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(bFiltrar)
                    .addComponent(lPrecio)
                    .addComponent(tfPrecioDesde, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lPrecio2)
                    .addComponent(tfPrecioHasta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(5, 5, 5))
        );

        tResultados.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Codigo", "Dirección", "Barrio", "Tipo"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, true, false, true
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tResultados.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
        tResultados.setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        spScroll.setViewportView(tResultados);

        bAgregar.setText("Agregar");
        bAgregar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bAgregarActionPerformed(evt);
            }
        });

        bModificar.setText("Modificar");
        bModificar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bModificarActionPerformed(evt);
            }
        });

        bEliminar.setText("Eliminar");
        bEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bEliminarActionPerformed(evt);
            }
        });

        bReservar.setText("Reservar");
        bReservar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bReservarActionPerformed(evt);
            }
        });

        bVender.setText("Vender");
        bVender.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bVenderActionPerformed(evt);
            }
        });

        bCatalogo.setText("Catálogo");
        bCatalogo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bCatalogoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(spScroll, javax.swing.GroupLayout.PREFERRED_SIZE, 443, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(bAgregar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(bEliminar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(bReservar, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(bVender, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(bCatalogo, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(bModificar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                    .addComponent(pFiltros, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(pFiltros, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(bAgregar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(bModificar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(bEliminar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(bReservar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(bVender)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(bCatalogo)
                        .addGap(0, 34, Short.MAX_VALUE))
                    .addComponent(spScroll, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Método auxiliar para buscar Inmuebles en base a los criterios de búsqueda
     * ingresados en los campos dispuestos para tal fin.
     * Luego de realizar la búsqueda en la base de datos, se actualiza la tabla
     * de resultados para reflejar los nuevos Inmuebles buscados.
     * 
     * El DTOInmueble se utiliza con el fin de encapsular la información que se
     * va a pasar al DAOInmueble.
     */
    private void filtrarResultados()
    {
        DTOInmueble criteriosBusqueda = new DTOInmueble();
        
        // seteamos el id de la provincia (coincide con el index del combobox)
        if (this.cbProvincia.getSelectedIndex() > 0) {
            criteriosBusqueda.setIdProvincia(cbProvincia.getSelectedIndex());
        }
        
        // seteamos el id de la localidad
        if (this.cbLocalidad.getSelectedIndex() > 0) {
            Object[] localidades = VPrincipal.provincias.get(cbProvincia.getSelectedIndex()).getLocalidads().toArray();
            Localidad l = (Localidad) localidades[cbLocalidad.getSelectedIndex()];
            
            criteriosBusqueda.setIdLocalidad(l.getIdLocalidad());
        }

        criteriosBusqueda.setBarrio(this.tfBarrio.getText());
        criteriosBusqueda.setTipo(DAOInmueble.setInmuebleTipoEnum(cbTipoInmueble.getSelectedIndex()-1));
        
        Integer cant_dormitorios = new Integer(0);
        Double precio_desde = new Double(0);
        Double precio_hasta = new Double(0);

        String barrio = tfBarrio.getText();

        if(!tfDormitorios.getText().isEmpty()) {
            try {
                cant_dormitorios = Integer.parseInt(this.tfDormitorios.getText());
                this.tfDormitorios.setForeground(Color.black);
                criteriosBusqueda.setDormitorios(cant_dormitorios);
            }
            catch(NumberFormatException e) {
                JOptionPane.showMessageDialog(this, "La cantidad de dormitorios debe ser un número entero", "Error! Cantidad de dormitorios", JOptionPane.ERROR_MESSAGE);
                tfDormitorios.setForeground(Color.red);
                return;
            }
        }

        if(!this.tfPrecioDesde.getText().isEmpty()) {
            try {
                precio_desde = Double.parseDouble(tfPrecioDesde.getText());
                tfPrecioDesde.setForeground(Color.black);
                criteriosBusqueda.setPrecioDesde(precio_desde);
            }
            catch(NumberFormatException e) {
                JOptionPane.showMessageDialog(this, "El rango inferior del precio debe ser un número", "Error! Rango inferior del precio", JOptionPane.ERROR_MESSAGE);
                tfPrecioDesde.setForeground(Color.red);
                return;
            }
        }

        if (!this.tfPrecioHasta.getText().isEmpty()) {
            try {
                precio_hasta = Double.parseDouble(tfPrecioHasta.getText());
                tfPrecioHasta.setForeground(Color.black);
                criteriosBusqueda.setPrecioHasta(precio_hasta);
            }
            catch(NumberFormatException e) {
                JOptionPane.showMessageDialog(this, "El rango superior del precio debe ser un número", "Error! Rango superior del precio", JOptionPane.ERROR_MESSAGE);
                tfPrecioHasta.setForeground(Color.red);
                return;
            }
        }

        if(precio_desde > precio_hasta) {
            JOptionPane.showMessageDialog(this, "El rango inferior no puede ser mayor al rango inferior", "Error! Rango inferior mayor al rango superior", JOptionPane.ERROR_MESSAGE);
            tfPrecioDesde.setForeground(Color.red);
            return;
        }

        this.inmueblesBusqueda = DAOInmueble.filtrarInmuebles(criteriosBusqueda);

        actualizarListadoInmuebles();
    }
    
    private void bFiltrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bFiltrarActionPerformed
        filtrarResultados();
    }//GEN-LAST:event_bFiltrarActionPerformed

    /**
     * A través de la ventana de búsqueda de personas, se accede a este método
     * para almacenar el numero de documento del cliente buscado.
     * 
     * @param numDoc_cliente: numero de documento del cliente que se ha buscado.
     */
    public void setNumDocCliente(String numDoc_cliente) 
    {
        this.numDoc_cliente = numDoc_cliente;
    }

     /**
     * Método auxiliar para mostrar los resultados de la busqueda
     * de Inmuebles en la tabla Resultado
     */
    public void actualizarListadoInmuebles() {
        limpiarTablaResultados();

        DefaultTableModel modeloResultados = (DefaultTableModel) this.tResultados.getModel();

        if(this.inmueblesBusqueda != null) {
            int cantResultados = this.inmueblesBusqueda.size();
            for(int i = 0; i<cantResultados; i++)
                modeloResultados.addRow(DAOInmueble.convertirInmuebleParaMostrarEnTabla(this.inmueblesBusqueda.get(i)));
            
            this.tResultados.repaint();
        }
        else {
            Vector sinResultados = new Vector();
            sinResultados.add("");
            sinResultados.add("<Tabla vacía>");
            sinResultados.add("");
            sinResultados.add("");
            modeloResultados.addRow(sinResultados);
        }
    }
    
    /**
     * elimina todos los registros de búsquedas mostrados en la tabla Resultaods
     */
    private void limpiarTablaResultados(){
        DefaultTableModel modeloResultados = (DefaultTableModel) tResultados.getModel();

        // se vacia la tabla de resultados
        while(modeloResultados.getRowCount() > 0)
            modeloResultados.removeRow(0);
    }
    
    private void cbProvinciafiltrarLocalidades(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbProvinciafiltrarLocalidades
        int provincia_seleccionada = cbProvincia.getSelectedIndex()-1; //Se resta uno porque el primer ítem es a modo de título

        Set localidades = VPrincipal.provincias.get(provincia_seleccionada).getLocalidads();
        Iterator i = localidades.iterator();

        cbLocalidad.removeAllItems();
        cbLocalidad.addItem("Localidad");

        while(i.hasNext()) {
            cbLocalidad.addItem(((Localidad) i.next()).getNombre());
        }
    }//GEN-LAST:event_cbProvinciafiltrarLocalidades

    private void bAgregarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bAgregarActionPerformed
        JDialog ventanaAlta = new VAltaInmueble(null, true, null, -1);
        ventanaAlta.setVisible(true);
        
        filtrarResultados();
    }//GEN-LAST:event_bAgregarActionPerformed

    private void bModificarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bModificarActionPerformed
        JDialog ventanaAlta = null;

        // recupero el cliente de la fila seleccionada
        int selectedRow = this.tResultados.getSelectedRow();

        if (selectedRow == -1) {
        // si no hay fila seleccionada, no se realiza ninguna acción
            return;
        }

        // recupero el codigo del cliente de la fila seleccionada
        String codigoInmueble = (String) this.tResultados.getModel().getValueAt(selectedRow, 0);

        Inmueble i = DAOInmueble.getByCodigo(codigoInmueble);

        ventanaAlta = new VAltaInmueble(null, true, i, -1);

        ventanaAlta.setVisible(true);
        
        filtrarResultados();
    }//GEN-LAST:event_bModificarActionPerformed

    private void bEliminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bEliminarActionPerformed
        // recupero el cliente de la fila seleccionada
        int selectedRow = this.tResultados.getSelectedRow();

        if (selectedRow == -1) {
        // si no hay fila seleccionada, no se realiza ninguna acción
            return;
        }

        // recupero el codigo del cliente de la fila seleccionada
        String codigoInmueble = (String) this.tResultados.getModel().getValueAt(selectedRow, 0);
        Inmueble inm = DAOInmueble.getByCodigo(codigoInmueble);
        // muestro dialogo de confirmacion para asegurar la eliminacion
        int dialogButton = JOptionPane.showConfirmDialog (null, "¿Está seguro que desea eliminar el Inmueble seleccionado?","Eliminar Inmueble",JOptionPane.YES_NO_OPTION);
        if(dialogButton == JOptionPane.YES_OPTION){
            if (DAOReservaInmueble.getByIdInmueble(inm.getIdInmueble()).isEmpty() 
                && DAOVentaInmueble.getByIdInmueble(inm.getIdInmueble()).isEmpty()) {
            // el inmueble no tiene asociaciones, por lo tanto puede ser eliminado
                DAOInmueble.delete(inm);
                JOptionPane.showMessageDialog(this, "El inmueble "+codigoInmueble+" fue eliminado de la base de datos.", "Inmueble Eliminado", JOptionPane.INFORMATION_MESSAGE);
                filtrarResultados();
            }
            else {
            // el inmueble tiene asociaciones y NO puede ser eliminado
                JOptionPane.showMessageDialog(this, "El inmueble "+codigoInmueble+" NO pudo ser eliminado de la base de datos. El mismo posee registradas reservas y/o ventas.", "¡Error! No se pudo completar la acción", JOptionPane.ERROR_MESSAGE);
            }
        }
    }//GEN-LAST:event_bEliminarActionPerformed

    private void bReservarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bReservarActionPerformed

        DefaultTableModel modelo = (DefaultTableModel) this.tResultados.getModel();
        Inmueble inmueble = new Inmueble();

        int cant_filas_seleccionadas = this.tResultados.getSelectedRowCount();

        if(cant_filas_seleccionadas == 1) {
            
            //cargar el inmueble en inmueble
            String codigoInmueble = (String) this.tResultados.getModel().getValueAt(tResultados.getSelectedRow(), 0);
            inmueble = DAOInmueble.getByCodigo(codigoInmueble);
            
            //Si el inmueble ya esta reservado, no se puede volver a reservar
            if(inmueble.getReservaInmuebles().isEmpty()) {
                VReservaInmueble vRI = new VReservaInmueble(null,true,inmueble);
                vRI.setVisible(true);
            }
            else {
                //Puede estar reservada pero reserva vencida
                Date fechaActual = new Date();
                Date fechaReserva = null; 
                Calendar c = Calendar.getInstance();
                boolean tieneReserva = false;
                
                Iterator i = inmueble.getReservaInmuebles().iterator();
                while(i.hasNext()) {
                    ReservaInmueble rI = (ReservaInmueble) i.next();
                    fechaReserva = rI.getId().getFechaReserva();
                    c.setTime(fechaReserva);
                    c.add(Calendar.DATE, rI.getTiempoVigencia());
                              
                    if(fechaActual.compareTo(fechaReserva) >= 0 && fechaActual.compareTo(c.getTime()) < 0){
                        tieneReserva = true;
                    }
                }
                
                if(!tieneReserva) {
                    VReservaInmueble vRI = new VReservaInmueble(null,true,inmueble);
                    vRI.setVisible(true);
                }
                else {
                    JOptionPane.showMessageDialog(this, "El inmueble ya fue reservado", "¡Error!", JOptionPane.INFORMATION_MESSAGE);
                }
            }
        }   
        else {
            JOptionPane.showMessageDialog(this, "Debe seleccionar un inmueble de la lista.", "Selección Inmueble", JOptionPane.INFORMATION_MESSAGE);
        }

    }//GEN-LAST:event_bReservarActionPerformed

    private void bVenderActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bVenderActionPerformed
        // TODO add your handling code here:
        int fila_seleccionada = this.tResultados.getSelectedRow();
        
        if (fila_seleccionada != -1){
            
            // recupero el codigo del inmueble
            String codigoInmueble = this.tResultados.getModel().getValueAt(fila_seleccionada, 0).toString();

            Inmueble i = DAOInmueble.getByCodigo(codigoInmueble);

            // lanzo la ventana de Venta Inmueble
            VVentaInmueble vAI = new VVentaInmueble(null, true, i);
            vAI.setVisible(true);
        }
        else {
            JOptionPane.showMessageDialog(this, "Debe seleccionar un inmueble de la lista.", "Selección Inmueble", JOptionPane.INFORMATION_MESSAGE);
        }
            
    }//GEN-LAST:event_bVenderActionPerformed

    private void bCatalogoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bCatalogoActionPerformed
        DefaultTableModel modelo = (DefaultTableModel) tResultados.getModel();

        int cant_filas_seleccionadas = tResultados.getSelectedRowCount();

        if(cant_filas_seleccionadas > 0) {
            int[] filas_seleccionadas = tResultados.getSelectedRows();

            VPrincipal.codigos = new Vector<String>();
            for (int i = 0; i < filas_seleccionadas.length; i++) {
                VPrincipal.codigos.add((String) tResultados.getValueAt(filas_seleccionadas[i], 0));
            }

            VBuscarPersona vBP = new VBuscarPersona(this, "Cliente");
            vBP.setVisible(true);
        }
        else {
            JOptionPane.showMessageDialog(this, "Debe seleccionar al menos un inmueble de la lista.", "Error!", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_bCatalogoActionPerformed

    public void generarCatalogo() 
    {
        PopUp cargando = new PopUp(null, false);
        cargando.setVisible(true);
        Cliente c = DAOCliente.getByNumDoc(numDoc_cliente.toString());
            
        if(c != null) {
            new GenerarCatalogo(codigos, c.getNombre()+" "+c.getApellido());
            cargando.dispose();
        }
        else {
            JOptionPane.showMessageDialog(this, "Debe seleccionar un cliente para generar el catálogo.", "Error! - Cliente no seleccionado", JOptionPane.ERROR_MESSAGE);
        }
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton bAgregar;
    private javax.swing.JButton bCatalogo;
    private javax.swing.JButton bEliminar;
    private javax.swing.JButton bFiltrar;
    private javax.swing.JButton bModificar;
    private javax.swing.JButton bReservar;
    private javax.swing.JButton bVender;
    private javax.swing.JComboBox cbLocalidad;
    private javax.swing.JComboBox cbProvincia;
    private javax.swing.JComboBox cbTipoInmueble;
    private javax.swing.JLabel lBarrio;
    private javax.swing.JLabel lDormitorios;
    private javax.swing.JLabel lPrecio;
    private javax.swing.JLabel lPrecio2;
    private javax.swing.JPanel pFiltros;
    private javax.swing.JScrollPane spScroll;
    private javax.swing.JTable tResultados;
    private javax.swing.JTextField tfBarrio;
    private javax.swing.JTextField tfDormitorios;
    private javax.swing.JTextField tfPrecioDesde;
    private javax.swing.JTextField tfPrecioHasta;
    // End of variables declaration//GEN-END:variables

}
